package fiuba.algo3.algothief;

import java.util.ArrayList;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class Caso {

	private Criminal criminal;
	private ArrayList<Ciudad> ciudades;
	private ArrayList<Ciudad> ciudadesNoVisitadas;
	
	public Caso() {
		this.ciudades = new ArrayList<Ciudad>();
		this.ciudadesNoVisitadas = new ArrayList<Ciudad>();
	}
	
	
	public Criminal getCriminal() {
		return criminal;
	}
	
	
	public ArrayList<Ciudad> getCiudadesNoVisitadas() {
		return this.ciudadesNoVisitadas;
	}

	
	public void setCriminal(Criminal criminal) {
		this.criminal = criminal;
	}

	
	public ArrayList<Ciudad> getCiudades() {
		return ciudades;
	}

	
	public void agregarCiudad(Ciudad ciudad) {
		this.ciudades.add(ciudad);
	}
	
	
	public Element serializar(Document doc) {
		Element elementoCaso = doc.createElement("Caso");
		elementoCaso.appendChild(this.criminal.serializar(doc));
		Element elementoCiudades = doc.createElement("Ciudades");
		elementoCaso.appendChild(elementoCiudades);
		for (Ciudad ciudad : this.ciudades) {
			elementoCiudades.appendChild(ciudad.serializar(doc));
		}
		Element elementoCiudadesNoVisitadas = doc.createElement("CiudadesNoVisitadas");
		elementoCaso.appendChild(elementoCiudadesNoVisitadas);
		for (Ciudad ciudad : this.ciudadesNoVisitadas) {
			elementoCiudadesNoVisitadas.appendChild(ciudad.serializar(doc));
		}
		return elementoCaso;
	}

	
	public static Caso hidratar(Document doc) {
		Caso nuevoCaso = new Caso();
		Element elementoCriminal = (Element)doc.getElementsByTagName("Criminal").item(0);
		nuevoCaso.setCriminal(Criminal.hidratar(elementoCriminal));
		Element elementoCiudades = (Element)doc.getElementsByTagName("Ciudades").item(0);
		for(int i=0; i< elementoCiudades.getChildNodes().getLength(); i++) {
			Ciudad ciudad = Ciudad.cargar(elementoCiudades.getChildNodes().item(i));
			nuevoCaso.agregarCiudad(ciudad);
		}
		Element elementoCiudadesNoVisitadas = (Element)doc.getElementsByTagName("CiudadesNoVisitadas").item(0);
		for(int i=0; i< elementoCiudadesNoVisitadas.getChildNodes().getLength(); i++) {
			Ciudad ciudad = Ciudad.cargar(elementoCiudadesNoVisitadas.getChildNodes().item(i));
			nuevoCaso.agregarCiudadNoVisitada(ciudad);
		}
		return nuevoCaso;
	}

	
	public void agregarCiudadNoVisitada(Ciudad ciudad) {
		this.ciudadesNoVisitadas.add(ciudad);
	}


	public Ciudad getCiudadAleatoriaQueNoEsteEnLaPosicion(int posicionProhibida) {
		boolean encontrado = false;
		Ciudad ciudad = null;
		do {
			int numero = (int)(Math.random() * this.ciudades.size());
			if (numero != posicionProhibida) {
				ciudad = this.ciudades.get(numero);
				if (!this.criminal.getCiudadesVisitadas().contains(ciudad)) {
					encontrado = true;
				}
			}
		}while (!encontrado);
		return ciudad;
	}

	
	public void armar(ConfiguracionInicial ci) {	
		this.criminal = ci.getCriminal();
		this.criminal.setCiudadesVisitadas(ci.getCiudadesCriminal());
		this.ciudadesNoVisitadas=ci.getCiudadesNoVisitadasPorCriminal();
	}

	
	public Ciudad getCiudadAleatoriaListaNoVisitadaCriminal(Ciudad ciudad) {
		int random = (int)(Math.random() * this.ciudadesNoVisitadas.size());
		Ciudad ciudadADevolver=this.ciudadesNoVisitadas.get(random);
		while(ciudad==ciudadADevolver){		
			random = (int)(Math.random() * this.ciudadesNoVisitadas.size());
			ciudadADevolver=this.ciudadesNoVisitadas.get(random);
		}
		return ciudadADevolver;
	}
}
